package com.wgy.day26.HashMap集合;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/*
java.util.HashMap<k,v>集合 implements Map<k,v>接口

HashMap集合的特点:
           1.HashMap集合底层是哈希表:查询的速度非常的快
                       JDK1.8之前:数组+单向链表
                       JDK1.8之后:数组+单选链表/红黑树(链表的长度超过8):提高查询的速度
           2.HashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
           3.HashMap集合是一个是以key进行排序的

HashMap存储自定义类型的键值
        Map集合保证key是唯一的:
        作为key的元素,必须要重写hashCode方法和equals方法,以保证key唯一

*/
public class Demo01HashMap {
    public static void main(String[] args) {
        show01();
    }

    /*
     HashMap存储自定义型键值
        key:String类型
            String类重写了hashCode方法和equals方法,可以保证key唯一
       Value:Person类
             value值可以重复(同名同年龄的人视作同一个人)
       */
    public static void show01() {
        // 创建HashMap对象
        HashMap<String, Person> map = new HashMap<>();
        //往集合中添加元素
        map.put("北京", new Person("张三", 18));
        map.put("上海", new Person("李四", 19));
        map.put("广州", new Person("王五", 20));
        map.put("北京", new Person("赵六", 18));
        //使用keySet加增强for遍历Map集合
        Set<String> set = map.keySet();
        for (String key : set) {
            Person value = map.get(key);
            System.out.println(key + "=" + value);
        }
      /*  上海=Person{name='李四', age=19}
        广州=Person{name='王五', age=20}
        北京=Person{name='赵六', age=18}*/
    }

    /*
    HashMap存储自定义型键值
           key:Person类型
               Person类型就必须要重写hashCode方法和equals方法,以保证key唯一
          Value:String类型 可以重复
          */
    public static void show02() {
        HashMap<Person, String> map = new HashMap<>();
        map.put(new Person("女王", 18), "英国");
        map.put(new Person("秦始皇", 18), "秦国");
        map.put(new Person("普京", 18), "俄罗斯");
        map.put(new Person("女王", 18), "毛里求斯");
        //使用entrySet和增强for遍历Map集合
        Set<Map.Entry<Person, String>> set = map.entrySet();
        for (Map.Entry<Person, String> entry : set) {
            Person key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + "=" + value);
        }
          /*Person类型没有重写hashCode方法和equals方法的结果:
                 Person{name='女王', age=18}=毛里求斯
                 Person{name='秦始皇', age=18}=秦国
                 Person{name='女王', age=18}=英国
                 Person{name='普京', age=18}=俄罗斯
           */

           /*Person类型重写hashCode方法和equals方法之后的结果:
               Person{name='女王', age=18}=毛里求斯
               Person{name='秦始皇', age=18}=秦国
               Person{name='普京', age=18}=俄罗斯*/
    }
}